package com.study.chunguard.common.utils.datatools.model;

import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * Excel 导入结果的通用模型，用于采集导入结果信息
 *
 * @author zhaowenhao
 * @since 2024-07-23
 */
@Schema(description = "Excel 导入结果的通用模型")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ExcelImportResult implements Serializable {

    /**
     * 成功行数
     */
    @Schema(description = "成功行数")
    @JsonIgnore
    private AtomicInteger successNumAtomicInteger = new AtomicInteger(0);

    /**
     * 失败行数
     */
    @Schema(description = "失败行数")
    @JsonIgnore
    private AtomicInteger failNumAtomicInteger = new AtomicInteger(0);

    /**
     * 失败行错误信息列表
     */
    @Schema(description = "失败行错误信息列表")
    @JsonIgnore
    private ConcurrentLinkedQueue<String> errorMessageQueue = new ConcurrentLinkedQueue<>();

    /**
     * 增加成功行数
     */
    public void incrementSuccessNum() {
        successNumAtomicInteger.incrementAndGet();
    }

    /**
     * 增加指定数量的成功行数
     *
     * @param count 数量
     */
    public void incrementSuccessNum(int count) {
        successNumAtomicInteger.addAndGet(count);
    }

    /**
     * 增加失败行数
     */
    public void incrementFailNum() {
        failNumAtomicInteger.incrementAndGet();
    }

    /**
     * 增加指定数量的失败行数
     *
     * @param count 数量
     */
    public void incrementFailNum(int count) {
        failNumAtomicInteger.addAndGet(count);
    }

    /**
     * 添加错误信息
     *
     * @param errorMessage 错误信息
     */
    public void addErrorMessage(String errorMessage) {
        errorMessageQueue.add(errorMessage);
    }

    /**
     * 批量添加错误信息
     *
     * @param errorMessages 错误信息列表
     */
    public void addErrorMessages(List<String> errorMessages) {
        this.errorMessageQueue.addAll(errorMessages);
    }

    /**
     * 获取成功行数
     */
    @Schema(description = "成功行数")
    public Integer getSuccessNum() {
        return successNumAtomicInteger.get();
    }

    /**
     * 获取失败行数
     */
    @Schema(description = "失败行数")
    public Integer getFailNum() {
        return failNumAtomicInteger.get();
    }

    /**
     * 获取错误信息列表
     */
    @Schema(description = "错误信息列表")
    public List<String> getErrorMessages() {
        return new ArrayList<>(errorMessageQueue);
    }

    /**
     * 创建新实例
     *
     * @return 新实例
     */
    public static ExcelImportResult createInstance() {
        return new ExcelImportResult();
    }
}
